#pragma once

#include "../element_sorter.h"
#include "engine_object.h"
#include "threadpool/tp_define.h"

namespace burn {

class GEngine : public GEngineObject {
protected:
  /**
   * 将所有注册进入 pipeline的内容，进行分析和解构
   * @param elements
   * @return
   */
  virtual CStatus setup(const GSortedGElementPtrSet &elements) = 0;

  /**
   * 执行完毕后，确认运行是否正常
   * @return
   */
  virtual CStatus afterRunCheck() = 0;

  /**
   * 设置线程池信息
   * @param ptr
   * @return
   */
  GEngine *setThreadPool(UThreadPool* ptr) {
    CGRAPH_ASSERT_NOT_NULL_RETURN_NULL(ptr)
    thread_pool_ = ptr;
    return this;
  }

protected:
  UThreadPool* thread_pool_{nullptr}; // 内部执行的线程池
  CUint total_element_size_ = 0;        // 总的element的数量
  CMSec element_run_ttl_ =
      CGRAPH_DEFAULT_ELEMENT_RUN_TTL; // 单个节点最大运行周期
  int schedule_strategy_ = CGRAPH_DEFAULT_TASK_STRATEGY; // 调度策略

  friend class GElementManager;
  friend class GPipeline;
};

using GEnginePtr = GEngine *;

} // namespace burn